#ifndef __PROCESO_PRINCIPAL_H_INCLUDED__
#define __PROCESO_PRINCIPAL_H_INCLUDED__

#include "Proceso.h"
#include "Debug.h"
#include "Mensajes.h"
#include <map>
#include <algorithm>
#include "Jugador.h"
#include "fifo/Fifo.h"
#include "Juego.h"
#include <signal.h>

class Juego;
class ProcesoPrincipal:Proceso{
	friend class Juego;
	friend class MensajeListaJugadores;
	void procesarComandoServer(MensajeComando *m);
protected:
	std::map<int,Jugador> jugadores;
	std::map<int,int> invitaciones;
	std::map<int,Juego*> juegos;


	Fifo fifo;
	static bool salir;
	int pidTeclado;

	void procesarMensaje(Mensaje *m);
	void procesarInvitacion(MensajeInvitacion *m);
	Fifo obtenerFifo(int numeroJugador);
	
	void procesarTeclado(){
		while(!salir){
			std::string comando;
			std::cin >> comando;
			
			MensajeComando m;
			m.setComando(comando);
			fifo.escribir(m.getBuffer(), m.size());
		}
	}

	bool existeJugador(int jugador){ return jugadores.find(jugador) != jugadores.end();}

	bool estaJugando(int jugador){ return existeJugador(jugador) && juegos.find(jugador)!=juegos.end(); }

	void enviarMensaje(int jugador, Mensaje* m);
	void finalizar(){
		ProcesoPrincipal::salir = true;
		kill(pidTeclado, SIGUSR1);
	}
public:

	static void setSalida(){ 
		salir=true; 
		fclose(0); //hack para eviar que el proceso del
			   //teclado se quede esperando
	}

	ProcesoPrincipal(){ 
		salir=false;
		signal(SIGINT, SIG_IGN);
		signal(SIGTERM, SIG_IGN);
	}
	void run();
	~ProcesoPrincipal();
};

#endif //__PROCESO_PRINCIPAL_H_INCLUDED__
